#pragma once
#include <iostream>
#include <string>

// 定义所有支持的运算符集合
std::string opers="+-*/%";  // 加、减、乘、除、取模

// 定义错误码枚举类型
enum {
    DivZero=1,    // 除零错误
    ModZero,      // 取模零错误（值为2）
    Unknown       // 未知错误（值为3）
};

// Task类：表示一个算术运算任务
class Task
{
public:
    // 默认构造函数
    Task()
    {}

    // 带参数的构造函数
    // x: 第一个操作数
    // y: 第二个操作数
    // op: 运算符
    Task(int x, int y, char op) 
        : data1_(x),      // 初始化第一个操作数
          data2_(y),      // 初始化第二个操作数
          oper_(op),      // 初始化运算符
          result_(0),     // 初始化结果为0
          exitcode_(0)    // 初始化错误码为0（表示无错误）
    {
    }

    // 执行运算的核心函数
    void run()
    {
        switch (oper_)
        {
        case '+':    // 加法运算
            result_ = data1_ + data2_;
            break;
        case '-':    // 减法运算
            result_ = data1_ - data2_;
            break;
        case '*':    // 乘法运算
            result_ = data1_ * data2_;
            break;
        case '/':    // 除法运算
            {
                if(data2_ == 0) exitcode_ = DivZero;  // 检查除数为0的情况
                //如果是0则设置错误代码为DivZero（除零错误）

                else result_ = data1_ / data2_;
            }
            break;
        case '%':    // 取模运算
           {
                if(data2_ == 0) exitcode_ = ModZero;  // 检查除数为0的情况
                else result_ = data1_ % data2_;
            }            
            break;
        default:     // 未知运算符
            exitcode_ = Unknown;
            break;
        }
    }

    // 重载函数调用运算符"()"，使对象可以像函数一样被调用
    void operator ()()
    {
        run();
    }

    // 获取完整的运算结果字符串
    // 格式：操作数1 运算符 操作数2 = 结果 [错误码]
    std::string GetResult()
    {
        std::string r = std::to_string(data1_);  // 转换第一个操作数
        r += oper_;                              // 添加运算符
        r += std::to_string(data2_);            // 转换第二个操作数
        r += "=";                               // 添加等号
        r += std::to_string(result_);           // 添加计算结果
        r += "[code: ";                         // 添加错误码标记
        r += std::to_string(exitcode_);         // 添加错误码
        r += "]";
        return r;
    }

    // 获取任务的字符串表示（不包含结果）
    // 格式：操作数1 运算符 操作数2 =?
    std::string GetTask()
    {
        std::string r = std::to_string(data1_);  // 转换第一个操作数
        r += oper_;                              // 添加运算符
        r += std::to_string(data2_);            // 转换第二个操作数
        r += "=?";                              // 添加待计算标记
        return r;
    }

    // 析构函数（目前为空）
    ~Task()
    {
    }

private:
    int data1_;     // 第一个操作数
    int data2_;     // 第二个操作数
    char oper_;     // 运算符

    int result_;    // 计算结果
    int exitcode_;  // 错误码（0表示无错误）
};